#include "chatserver.hpp"
#include "chatservice.hpp"
#include "json.hpp"
#include<functional>
#include<iostream>
#include<muduo/base/Logging.h>
using namespace std;
using namespace placeholders;
using json = nlohmann::json;

ChatServer::ChatServer(EventLoop *loop, const InetAddress &listenAddr, 
const string &nameArg):_server(loop,listenAddr,nameArg),_loop(loop)
{
   //注册链接回调
   _server.setConnectionCallback(std::bind(&ChatServer::onConnection,this,_1));

   //注册消息回调
   _server.setMessageCallback(std::bind(&ChatServer::onMessge,this,_1,_2,_3));

   //设置线程数量
   _server.setThreadNum(4);

}

//启动服务
void ChatServer::start(){
    _server.start();
}

// 上报链接相关信息的回调函数
void ChatServer::onConnection(const TcpConnectionPtr &conn)
{
    if(!conn->connected())
    {
        LOG_INFO<<"CONNECT FAILED!!!";
        ChatService::instance()->clientCloseException(conn);
        conn->shutdown();
    }
    else
    {
        std::cout<<"链接成功"<<endl;
    }
}

// 上报读写事件相关信息的回调函数
void ChatServer::onMessge(const TcpConnectionPtr &conn, Buffer *buffer, Timestamp time)
{
    string buf = buffer->retrieveAllAsString();
    // 数据的反序列化
    json js = json::parse(buf);
    std::cout<<"传过来的消息是"<<buf<<endl;
    // 通过js["megid"]获取业务handler，提前在业务模块绑定好，这里网络模块看不见
    // 每个业务都传conn js time 达到的目的：完全解耦网络模块和业务模块

    // 通过js["msgid"] 获取=》业务handler=》conn js time
    auto msgHandler = ChatService::instance()->getHandler(js["msgid"].get<int>());
    //回调消息绑定好的事件处理器，来执行相应的业务处理
    msgHandler(conn,js,time);
    
}